extends Area2D

#signal：信号
#Area：区，部位
#这定义了一个叫作“hit”的自定义信号，我们将使用 Area2D 来检测碰撞
signal hit #当玩家与敌人碰撞时，我们会让他发出这个信号

@export var speed=400 # 玩家移动的速递（像素/秒,pixels/sec）
#使用 export 关键字，可以在“检查器”中设置其值

var screen_size #游戏窗口的大小

# Called when the node enters the scene tree for the first time.
#当节点首次进入场景树时，_ready() 函数被调用
func _ready() -> void:
	screen_size = get_viewport_rect().size
	hide()  #隐藏玩家
	
# Called every frame. 'delta' is the elapsed time since the previous frame.
#_process() 函数定义玩家将执行的操作。_process() 在每一帧都被调用
#delta 参数是 帧长度 ——完成上一帧所花费的时间。 使用这个值的话，可以保证你的移动不会被帧率的变化所影响。
func _process(delta: float) -> void:
		
	#velocity 设置为 (0, 0)
	var velocity=Vector2.ZERO #玩家的运动矢量
	
	#Input.is_action_pressed()检测是否按下了某个键，如果按下会返回 true，否则返回 false
	#如果你同时按住 右 和 下，则生成的 velocity 向量将为 (1, 1)。此时，
	#由于我们同时向水平和垂直两个方向进行移动，玩家斜向移动的速度将会比水平移动要更快
	if Input.is_action_pressed("move_right"): 
		velocity.x += 1
	if Input.is_action_pressed("move_left"):
		velocity.x -= 1
	if Input.is_action_pressed("move_down"):
		velocity.y += 1
	if Input.is_action_pressed("move_up"):
		velocity.y -= 1
		
	if velocity.length()>0:
		velocity = velocity.normalized()*speed
		$AnimatedSprite2D.play() #$ 是 get_node() 的简写 ，此代码相对于：get_node("AnimatedSprite2D").play()
	else:
		$AnimatedSprite2D.stop()
	
	
	position += velocity * delta
	#clamp() 来防止它离开屏幕。 clamp 一个值意味着将其限制在给定范围内
	position = position.clamp(Vector2.ZERO, screen_size)
	
	#现在玩家可以移动了，需要根据方向更改 AnimatedSprite2D 所播放的动画。
	#我们的“walk”动画显示的是玩家向右走。向左移动时就应该使用 。
	if velocity.x != 0:
		$AnimatedSprite2D.animation = "walk"      #左右移动动画
		$AnimatedSprite2D.flip_v = false          #flip_v 将其进行垂直翻转
		$AnimatedSprite2D.flip_h = velocity.x < 0 #flip_h 属性将这个动画进行水平翻转
		
	elif velocity.y < 0:
		$AnimatedSprite2D.animation = "up" #向上移动的“up”动画
	
	elif velocity.y > 0:
		$AnimatedSprite2D.animation = "down" #向下移动的“down”动画
		
#连接的信号
func _on_body_entered(_body):
	hide() #玩家被击中后消失。
	hit.emit()
	#必须推迟，因为我们不能在物理回调中更改物理属性。
	$CollisionShape2D.set_deferred("disabled",true)
	#敌人每次击中 玩家时都会发出一个信号。我们需要禁用玩家的碰撞检测，确保我们不会多次触发 hit 信号
	#如果在引擎的碰撞处理过程中禁用区域的碰撞形状可能会导致错误。使用 set_deferred() 告诉 Godot 等待可以安全地禁用形状时再这样做。

#用于在开始新游戏时调用来重置玩家	
func start(pos):
	position=pos
	show()
	$CollisionShape2D.disabled=false
